//
//  StatusViewModle.swift
//  上海微博
//
//  Created by co on 16/3/3.
//  Copyright © 2016年 王南侠. All rights reserved.
//

import UIKit
import SDWebImage
    /// 结构体 - 在 Swift 中，结构体和类非常像
    /**
    1.可以定义属性
    2.可以有构造函数
    关于结构体，在 Swift 中和对象有一个显著的区别

    在传值的时候，结构体是按`值(copy)`传递，对象是按`址(地址指针)`传递

    在 Swift 的标准语法库中，结构体非常多！类非常少，只有 4 个！
*/
struct StatusCellLayout {
    ///控件间距
    let margin:CGFloat = 12
    /// 头像大小
    let IconSize = CGSize(width: 36, height: 36)
    /// 工具栏高度
    let toolbarHeight: CGFloat = 36
    
    /// 图片间距
    let picturesMargin:CGFloat = 2
    /// 每行图片数量
    let picturesPerRow:CGFloat = 3
    /// 配图视图宽度
    let picturesViewWith:CGFloat
    /// 计算图片尺寸
    let pictureSize :CGSize
    
    init(){
        picturesViewWith = UIScreen.mainScreen().bounds.width - 2 * margin
      let pictureWH = (picturesViewWith - (picturesPerRow - 1) * picturesMargin) / picturesPerRow
        pictureSize = CGSize(width: pictureWH, height: pictureWH)
        
    }
}

/// 全局微博 cell 的布局信息结构体
let CZStatusCellLayout = StatusCellLayout()



/// 微博模型（提示如果使用OC 开发 扔继承自 NSObject）
/// swift 中定义 '模型'继承自NSobject 目的 使用KVC 支持字典转模型
/// 如果没有任何父类。类的‘量基’轻

class StatusViewModle: CustomStringConvertible{
    
    /// 微博模型
    var status:Status
    // 行高属性
    var rowHight: CGFloat = 0
    
    /// 会员图标
    var userMemberImage:UIImage?
    /// 认证图标
    var useVipImage:UIImage?
    // MARK: - 微博数据
    // 来源字符串
    var sourceText:String?
    // 创建日期
    var creatTime:NSDate?
    // 微博视图配组 - 如果被转发微博存在图像 原创微博没有图像
    var picturesURls: [StatusPictures]? {
        return status.retweeted_status?.pic_urls ?? status.pic_urls
    }
    // MARK: - 配图视图默认无大小
    //  原创微博的配图图片大小
    var picturesViewSize = CGSizeZero
    /// 被转发微博的配图大小
    var retweetedPicturesViewSize = CGSizeZero
    // MARK: - 被转发微博文本
    var retweetedText: String? {
        // 没有转发微博
        if status.retweeted_status == nil {
            return nil
        }
        // 拼接字符串
        return "@" + (status.retweeted_status?.user?.screen_name ?? "")
        + ":" + (status.retweeted_status?.text ?? "")
    }
    
    // MARK: - 构造函数
    /**
     使用微博模型实例化视图模型
     
     - parameter status: 微博模型
     
     - returns: 视图模型
     */
    init(status:Status){
        self.status = status
        creatUserData()
        createStatusData()
        
//        // 测试代码。如果配图数量 >=4.将 pic_urls 只取前 4个
//        if status.pic_urls?.count >= 4 {
//            let urls = status.pic_urls!
//            
//            status.pic_urls = Array(urls[0..<4])
//        }
//        
        
        // 计算配图视图大小
        picturesViewSize = calPicturesViewSize(status.pic_urls)
        retweetedPicturesViewSize = calPicturesViewSize(status.retweeted_status?.pic_urls)
    }
    
    /// 描述信息
    var description:String{
        return status.description
    }
    
    // MARK : - 公共函数
    func calcRowHeight() {
        
        let layout = CZStatusCellLayout
        let lableSize = CGSize(width: layout.picturesViewWith, height: CGFloat(MAXFLOAT))
        
        // 1. 原创微博
        // 1> 顶部视图 = 顶部间距 * 2 + 头像高度 + 顶部间距
        rowHight = 3 * layout.margin + layout.IconSize.height
        
        // 2> 文字 = 文字高度 + 间距
        if let text = status.text {
            
            rowHight += (text as NSString).boundingRectWithSize(
                lableSize,
                options: .UsesLineFragmentOrigin,
                attributes: [NSFontAttributeName:UIFont.systemFontOfSize(15)],
                context: nil).height
            
            rowHight += layout.margin
            
        // 3> 配图视图,如果有：配图视图高度 + 间距
            if status.pic_urls?.count > 0 {
                rowHight += picturesViewSize.height + layout.margin
            }
        }
        
        // 2. 转发微博 ，不一定有
        if status.retweeted_status != nil {
            
            // 1> 文字：转发文字 + 2 * 间距
            if let text = retweetedText {
                
                rowHight += (text as NSString).boundingRectWithSize(
                    lableSize,
                    options: .UsesLineFragmentOrigin,
                    attributes: [NSFontAttributeName:UIFont.systemFontOfSize(14)],
                    context: nil).height
                
                rowHight += 2 * layout.margin
            }
        }
        
        // 2> 配图，如果有，配图视图高度 + 间距
        if status.retweeted_status?.pic_urls?.count > 0 {
            rowHight += retweetedPicturesViewSize.height + layout.margin
        }
       
        
        // 3. 工具栏 
        rowHight += layout.toolbarHeight
    }
    
    
    // 更新单张图片的配图大小
    func updateSingleImagePitureViewSize() {
        picturesViewSize = calSinglePictureViewSize(status.pic_urls)
        retweetedPicturesViewSize = calSinglePictureViewSize(status.retweeted_status?.pic_urls)
    }
    
    
    // MARK: - 私有函数
    /**
    计算单张配图的视图大小
    
    - parameter pic_urls: 配图视图数组
    
    - returns: 配图视图大小
    */
    
    private func calSinglePictureViewSize(pic_urls: [StatusPictures]?) -> CGSize{
        
        //判断配图数量
        if pic_urls?.count != 1 {
            return CGSizeZero
        }
        // TODO: - 返回临时大小
        let urlString = pic_urls![0].thumbnail_pic
        
        // 使用SDWebImage 的缓存函数 key = url完整的字符串
        // SDWebImage 是自己干了缓存的，如果有内存警告 或者磁盘超限 会清理缓存
        guard let image = SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(urlString) else {
            return CGSizeZero
        }
        
        // 提示SDWebImage 从3.7.4 开始 会将网络恢复的图像字典安装当前设备的分辨率转换
        print("图像分辨率 \(image.scale)")
        // 恢复图像尺寸
        let scale = UIScreen.mainScreen().scale
        var size = CGSize(width: image.size.width * scale, height: image.size.height * scale)
        
        // 如果宽度过窄或者过宽的图片处理
        let minWidth: CGFloat = 20
        let maxWidth: CGFloat = 400
        
        // 如果款第过小，将宽度调整到20
        size.width = size.width < minWidth ? minWidth : size.width
        
        if size.width > maxWidth {
            // 等比例缩放
            size.width = maxWidth
            
            size.height = size.width * image.size.height / image.size.width
            
        }
        
        
        return size
    }
    
    private func calPicturesViewSize(pic_urls: [StatusPictures]?) -> CGSize{
        
        // 1.判断图片数量
        let count = pic_urls?.count ?? 0
        
        // 2.如果没有图,直接返回 CGSizeZero
        if count == 0 {
            return CGSizeZero
        }
        
        let layout = CZStatusCellLayout
        
        // 2> 计算行数
        let row = CGFloat((count - 1) / Int(layout.picturesPerRow) + 1) // 记住
        
        // 3> 根据行数计算视图的高度
        let height = row * layout.pictureSize.height + (row - 1) * layout.picturesMargin
        
        return CGSize(width: layout.picturesViewWith, height: height)
    }
    
    // 计算微博数据
    private func createStatusData(){
        // 1.来源字符串
        // <a href=\"http://weibo.com/\" rel=\"nofollow\">微博 weibo.com</a>")
        if let source = status.source,
           let startIndex = source.rangeOfString("\">")?.endIndex,
           let endIndex = source.rangeOfString("</a>")?.startIndex{
                
           
            
            // 提取字符串
            sourceText = "来自 " + source.substringWithRange(startIndex..<endIndex)
            }
        
        // 2.创建日期
        creatTime = NSDate.cz_sinaDate(status.created_at)
    }
    
    // 计算用户数据
    private func creatUserData(){
        // 会员图标
        if status.user?.mbrank > 0 && status.user?.mbrank < 7 {
            userMemberImage = UIImage(named: "common_icon_membership_level\(status.user!.mbrank)")
        }
        switch status.user?.verified_type ?? -1 {
        case 0: useVipImage = UIImage(named: "avatar_vip")
        case 2, 3, 5: useVipImage = UIImage(named: "avatar_enterprise_vip")
        case 220: useVipImage = UIImage(named: "avatar_grassroot")
            default: break
        }
    }
    
}